gpointer user_data);
static void
-add_blink_timeout (GtkText *self)
+add_blink_timeout (GtkText *self,
+ gboolean delay)
{
GtkTextPrivate *priv = gtk_text_get_instance_private (self);
BlinkData *data;
data = g_new (BlinkData, 1);
data->start = priv->blink_start_time;
+ if (delay)
+ data->start += blink_time * 1000 / 2;
data->end = data->start + blink_time * 1000;
priv->blink_tick = gtk_widget_add_tick_callback (GTK_WIDGET (self),
int blink_time;
guint64 now;
float phase;
+ float alpha;
if (!gtk_widget_has_focus (GTK_WIDGET (self)))
{
phase = (now - data->start) / (float) (data->end - data->start);
- priv->cursor_alpha = blink_alpha (phase);
-
if (now >= data->end)
{
data->start = data->end;
data->end = data->start + blink_time * 1000;
}
- gtk_widget_queue_draw (widget);
+ alpha = blink_alpha (phase);
+
+ if (priv->cursor_alpha != alpha)
+ {
+ priv->cursor_alpha = alpha;
+ gtk_widget_queue_draw (widget);
+ }
return G_SOURCE_CONTINUE;
}
if (cursor_blinks (self))
{
if (!priv->blink_tick)
- add_blink_timeout (self);
+ add_blink_timeout (self, FALSE);
}
else
{
if (cursor_blinks (self))
{
remove_blink_timeout (self);
- add_blink_timeout (self);
+ add_blink_timeout (self, TRUE);
}
}